package com.wyix;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author wangdx
 * @since 2025/8/5
 */
public class ClubManager {

    public static void main(String[] args) throws InterruptedException {

        /******招新报名表（随机访问）******/
        //场景：社团需要展示所有报名学生的名单，支持快速按序号查看。 选择原因：ArrayList基于数组实现，O(1)随机访问，适合频繁遍历和按索引查询。
        List<String> applicantList = new ArrayList<>();
        applicantList.add("张三");  // 添加报名者
        applicantList.add("李四");
        // 第2个报名者（索引1）
        System.out.println("第2位报名者：" + applicantList.get(1));  // 输出：李四

        /******LinkedList：面试待办队列（频繁增删）******/
        //场景：社团需要按顺序处理面试请求，支持快速添加新请求（队尾）和叫号（队头）。 选择原因：LinkedList基于双向链表，O(1)头尾增删，适合队列/栈操作。
        LinkedList<String> interviewQueue = new LinkedList<>();
        interviewQueue.addLast("王五");  // 新面试请求入队（队尾）
        interviewQueue.addLast("赵六");
        String next = interviewQueue.removeFirst();  // 叫号（队头）
        System.out.println("当前面试者：" + next);  // 输出：王五


        /******HashMap：学生信息缓存（键值查询）******/
        //场景：快速根据学生学号查询姓名（例如核对报名信息）。 选择原因：HashMap基于哈希表，O(1)键值查询，适合快速缓存。
        Map<String, String> studentCache = new HashMap<>();
        studentCache.put("S001", "张三");  // 学号: 姓名
        studentCache.put("S002", "李四");
        String name = studentCache.get("S001");  // 根据学号查姓名
        System.out.println("学号S001的学生：" + name);  // 输出：张三


        /****** TreeMap：招新活动日程（自动排序）******/
        //场景：按时间顺序展示招新活动（如宣讲会、面试），自动按时间排序。 选择原因：TreeMap基于红黑树，自动按键（时间戳）排序，支持范围查询
        TreeMap<Long, String> activitySchedule = new TreeMap<>();
        activitySchedule.put(1718000000L, "社团宣讲会");  // 时间戳: 活动名
        activitySchedule.put(1718086400L, "第一轮面试");
        // 获取下一个活动（当前时间假设为1718050000）
        Map.Entry<Long, String> nextActivity = activitySchedule.higherEntry(1718050000L);
        System.out.println("下一个活动：" + nextActivity.getValue());  // 输出：第一轮面试\

        /****** HashSet：抽奖名单（去重）******/
        //场景：收集所有报名者的手机号用于抽奖，避免重复手机号参与。 选择原因：HashSet基于哈希表，元素唯一，自动去重。
        Set<String> phoneSet = new HashSet<>();
        phoneSet.add("138-1234-5678");
        phoneSet.add("138-1234-5678");  // 重复手机号
        System.out.println("有效手机号数量：" + phoneSet.size());  // 输出：1

        /****** TreeSet：积分排行榜（排序+去重）******/
        //场景：记录社团活动积分，自动按积分从高到低排序，且每人仅记录一次。 选择原因：TreeSet基于红黑树，元素唯一且自动排序。
        TreeSet<Integer> scoreRank = new TreeSet<>(Comparator.reverseOrder());  // 降序排序
        scoreRank.add(95);
        scoreRank.add(88);
        scoreRank.add(95);  // 重复积分
        System.out.println("前三名积分：" + scoreRank);  // 输出：[95, 88]

        /******ConcurrentHashMap：抢社团名额（多线程安全）******/
        //场景：社团仅10个名额，多线程模拟学生同时抢名额，统计剩余数量。 选择原因：ConcurrentHashMap分段锁设计，线程安全且高并发性能好。
        ConcurrentHashMap<String, Integer> remainingSlots = new ConcurrentHashMap<>();
        remainingSlots.put("总名额", 10);
        // 模拟3个线程同时抢名额
        Runnable task = () -> {
            remainingSlots.merge("总名额", -1, Integer::sum);
        };
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        Thread t3 = new Thread(task);

        t1.start();
        t2.start();
        t3.start();

        // 等待所有子线程执行完毕
        t1.join();
        t2.join();
        t3.join();
        System.out.println("剩余名额：" + remainingSlots.get("总名额"));  // 输出：7

    }
}
